package br.com.sms.facade;

import java.util.ArrayList;
import java.util.List;

import br.com.sms.dao.PerfilDAO;
import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Funcionalidade;
import br.com.sms.dominio.Perfil;
import br.com.sms.enuns.TipoFuncionalidade;
import br.com.sms.excecao.SmsException;
import br.com.sms.util.MensagensErro;

public class PerfilFacade {

	private PerfilDAO  dao;

	public PerfilFacade(){
		if(dao == null)
			dao = new PerfilDAO();
	}

	public Perfil salvar(Perfil perfil, List<Integer> marcados){
		List<TipoFuncionalidade> tipos = getTiposFuncionalidades(marcados);
		perfil.setFuncionalidades(getFuncionalidades(tipos));
		return dao.salvar(perfil, tipos);
	}
	
	public List<Perfil> recuperarPerfis(){
		return dao.recuperarPerfis();
	}
	
	public List<Perfil> recuperarPerfis(Cliente cliente){
		return dao.recuperarPerfis(cliente);
	}
	
	public Perfil recuperarPerfil(Perfil perfil){
		return dao.recuperarPerfil(perfil);
	}

	public void validarCampos(Perfil perfil, List<Integer> marcados) throws SmsException{

		if(perfil.getDescricao() == null || perfil.getDescricao().trim().length() == 0){
			throw new SmsException(MensagensErro.CAMPO_OBRIGATORIO.replace("?", "Descrição do perfil"));
		}

		if(marcados == null || marcados.size() == 0){
			throw new SmsException(MensagensErro.FUNCOES_INVALIDAS);
		}
	}
	
	private List<Funcionalidade> getFuncionalidades(List<TipoFuncionalidade> tipos){
		FuncionalidadeFacade funcionalidadeFacade = new FuncionalidadeFacade();
		List<Funcionalidade> lista = new ArrayList<Funcionalidade>();
		for (TipoFuncionalidade tipoFuncionalidade : tipos) {
			Funcionalidade funcionalidade = funcionalidadeFacade.recuperar(tipoFuncionalidade);
			if(funcionalidade == null){
				funcionalidade = new Funcionalidade();
				funcionalidade.setTipoFuncionalidade(tipoFuncionalidade);
				funcionalidade = funcionalidadeFacade.salvar(funcionalidade);
			}
			lista.add(funcionalidade);
		}
		
		return lista;
	}

	private List<TipoFuncionalidade> getTiposFuncionalidades(
			List<Integer> marcados) {
		List<TipoFuncionalidade> lista = new ArrayList<TipoFuncionalidade>();
		for (Integer integer : marcados) {
			lista.add(TipoFuncionalidade.getTipoFuncionalidade(integer));
		}
		return lista;
	}

	public void excluir(Perfil perfil) {
		dao.excluir(perfil);
	}
}
